// {{{ Import
//
// cpaint2.inc.js
// tinymce/tiny_mce_src.js
// tiny_mce_start.js
// misc.js 
//    lang().plural() 
//    lang().numeral()
//    window.console.log()
//    mceEnable()
//    mceDisable()
//    mceHandle()
// jplugins/jquery.field.js
//    formHash()
// juri.js
//    jUri().queryHash()
//
// Import }}}
// {{{ List of messages
//

// l:new_dom -- на странице новый html
//	dom:
// l:post_new_dom -- на странице новый пост (html)
//	dom:
// l:post_new -- на странице новый пост 
//	post:
// l:toggle_comments -- попросили показать/скрыть комменты
//	post:
// l:comment_new_html -- на странице новый коммент (html)
//	html:
//	comment_id: 
//	parent: DkComComment
// l:comment_new_dom -- на странице новый коммент (html)
//	dom:
//	list: DkComList
// l:comment_new -- на странице новый коммент
//	comment:
// l:comment_more_new_dom -- на странице новый экспандер комментов (html)
//	dom:
//	list: DkComMore
// l:comment_more_new -- на странице новый экспандер комментов
//	comment_more:
// l:comment_answer_new_dom -- на странице новый отвечальник комментов (html)
//	dom:
//	list: DkComCommentAnswer
// l:comment_answer_new -- на странице новый экспандер комментов
//	answer:
// l:comment_form_close -- на странице новый экспандер комментов
// l:comment_form_show -- на странице новый экспандер комментов
// l:comment_form_closed -- на странице новый экспандер комментов
// l:comment_form_showed -- на странице новый экспандер комментов
//	form:
// l:comment_counter_new -- на странице новый экспандер комментов
//	dom:
//	post:
// l:comment_edit_new -- на странице новый экспандер комментов
//	answer:
// l:comment_edit_form_showed -- на странице новый экспандер комментов
//	form:
// l:comment_edit_form_closed -- на странице новый экспандер комментов
//	form:
// l:comment_edit_form_show -- на странице новый экспандер комментов
//	comment:
// l:comment_edit_form_close -- на странице новый экспандер комментов
//	comment:

//
// List of messages }}}

// DkWidget {{{
//

function DkWidget() {
//    this._wgEvents = [];
}
DkWidget.prototype.wgBind = function (type, dom, f){ 
    var self = this, 
	cb = function () { f.apply(self, arguments); };
    this._wgEvents.push([dom, type, cb]);
    jQuery(dom).bind(type, cb);
}
DkWidget.prototype.wgUnbind = function (){ 
    var t;
    while (t = this._wgEvents.pop()) { jQuery(t[0]).unbind(t[1], t[2]); }
}

//
// DkWidget }}}

// DkComService {{{
//

var cp = new cpaint();

function DkComService(cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i]; 

    /** Вернуть комменты итема */
    this.on('r:comment_get_comments_ask', 'r:comment_get_comments_ans', {
		'method': 'getComments',
		'action': 'ajax_getComments', 
		'write' : function (m) { return [m.item_id] },
		'read'  : function (r) { return {
		    'count': r.ajaxResponse['0'].comments_count['0'].data,
		    'form' : r.ajaxResponse['0'].submit_form['0'].data,
		    'html' : r.ajaxResponse['0'].comments['0'].data} }});

    /** Вернуть коммент в виде html, как элемент ленты */
    this.on('r:comment_get_feed_comment_ask', 'r:comment_get_feed_comment_ans', {
		'method': 'getFeedComment',
		'action': 'ajax_getComment', 
		'write' : function (m) { return [m['comment_id'], true] },
		'read'  : function (r) { return {
		    'html'       : r.ajaxResponse['0'].html['0'].data,
		    'comment_id' : r.ajaxResponse['0'].comment_oid['0'].data} }});

    /** Вернуть коммент в виде html */
    this.on('r:comment_get_comment_ask', 'r:comment_get_comment_ans', {
		'method': 'getComment',
		'action': 'ajax_getComment', 
		'write' : function (m) { return [m['comment_id'], true] },
		'read'  : function (r) { return {
		    'html'       : r.ajaxResponse['0'].html['0'].data,
		    'comment_id' : r.ajaxResponse['0'].comment_oid['0'].data} }});

    /** Вернуть дочерние коменты */
    this.on('r:comment_child_ask', 'r:comment_child_ans', {
		'action': 'ajax_getChildsOfComment', 
		'method': 'getChilds',
		'write' : function (m) { return [m['comment_id'], m] },
		'read'  : function (r) { return {
		    'html'     : r.ajaxResponse['0'].comments['0'].data,
		    'item_id'  : r.ajaxResponse['0'].item_oid['0'].data,
		    'parent_id': r.ajaxResponse['0'].parent_oid['0'].data,
		    'count'    : r.ajaxResponse['0'].comments_count['0'].data} }});
    /** Вернуть форму ответа */
    this.on('r:comment_answer_form_ask', 'r:comment_answer_form_ans', {
		'action': 'ajax_getSubmitForm', 
		'method': 'getAnswerForm',
		'write' : function (m) { return [m['item_id'], m['comment_id']] },
		'read'  : function (r) { return {
		    'html'    : r.ajaxResponse['0'].submit_form['0'].data} }});

    /** Создать коммент */
    this.on('r:comment_create_ask', 'r:comment_create_ans', {
		'method': 'createComment',
		//'url'   : window.submit_url,
		'action': 'ajax_submit_comment', 
		'write' : function (m) { return [m['item_oid'], m['parent_oid'], m['comment']] },
		'read'  : function (r) { return {
		    'status'    : r.ajaxResponse['0'].status['0'].data,
		    'comment_id': r.ajaxResponse['0'].comment_oid['0'].data} }});
    /** Удалить комент */
    this.on('r:comment_delete_ask', 'r:comment_delete_ans', {
		'method': 'deleteComment',
		'action': 'ajax_delComment', 
		'write' : function (m) { return [m['comment_id']] },
		'read'  : function (r) { return {
		    'comment_id' : r.ajaxResponse['0'].data} }});

    /** Вернуть форму редактирования */
    this.on('r:comment_edit_form_ask', 'r:comment_edit_form_ans', {
		'action': 'ajax_getUpdateForm', 
		'method': 'getEditForm',
		'write' : function (m) { return [m['comment_id']] },
		'read'  : function (r) { return {
		    'html'    : r.ajaxResponse['0'].data} }});
    /** Редактировать коммент */
    this.on('r:comment_edit_ask', 'r:comment_edit_ans', {
		'method': 'editComment',
		'action': 'ajax_upCommentBody', 
		'write' : function (m) { return [m['item_oid'], m['comment']] },
		'read'  : function (r) { return {
		    'comment_id': r.ajaxResponse['0'].data} }});
}

DkComService.prototype.on = function(what, then, proto) {
    proto.response = this.response;

    this[proto.method] = this.cbDispatcher(what, then, proto);
    jQuery(document).bind(what, this.CpaintDispatcher(what, then, proto));
}

DkComService.prototype.CpaintDispatcher = function(what, then, a) {
    var url      = typeof a.url == 'undefined' ? this.url : a.url;
    var action   = a.action;
    var read     = typeof a.read == 'undefined' ? this.read : a.read;
    var write    = typeof a.write == 'undefined' ? this.write : a.write;
    var response = a.response;
    return function(e, ask, cb) {
	var _cb = function(result) { response(ask, read(result), then, cb) }
	// HACK : 2008-09-12 : lucky
	// возможность передать мету в запросе
	var _url = url;
	if (ask['@meta']) {
	    if (ask['@meta']['url']) _url = ask['@meta']['url'];
	}
	// аргументы вызова cpaint.call():
	// (ajax_url, cpaint_function, callback [, cpaint_argument, .. ])
	var args = [_url, action, _cb].concat(write(ask));
	//window.console.log(args);
	cp.call.apply(cp, args);
    }
}
DkComService.prototype.cbDispatcher = function(what, then, a) {
    return function(ask, cb) {
	jQuery(document).trigger(what, [ask, cb]);
    }
}
DkComService.prototype.write = function(msg) { return msg; }
DkComService.prototype.read = function(response) { return response; }
DkComService.prototype.response = function(ask, ans, then, cb) {
    if (typeof cb == 'function') cb(ask, ans);
    jQuery(document).trigger(then, [ask, ans]);
}

//
// DkComService }}}
// DkComPostCtrl {{{
//

function DkComPostCtrl(cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    jQuery(document).bind('l:new_dom', this, function(e,m){
	e.data.$posts(m.dom).each(function(i, dom){
	    jQuery(document).trigger('l:post_new_dom', [{'dom':dom}]);
	});
    });

    jQuery(document).bind('l:post_new_dom', this, function(e,m){
	    var post = new DkComPost({'dom': m.dom});
	    jQuery(document).trigger('l:post_new', [{'post':post}]);
    });
}
DkComPostCtrl.prototype.$posts = function (dom) { return jQuery(dom).find('.js-post') }



function DkComPost (cfg) {
    this._wgEvents = [];

    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];
    this.wgBind('l:comment_list_showed', document, this.onCommentListShowed);
    this.wgBind('l:comment_list_hided', document, this.onCommentListHided);
}
DkComPost.prototype = new DkWidget();

DkComPost.prototype.onCommentListShowed = function (e,m) {
    if (this == m.list.post) {
	this.$boxPanel().addClass('commentinfo-selected-');
    }
}
DkComPost.prototype.onCommentListHided = function (e,m) {
    if (this == m.list.post) {
	this.$boxPanel().removeClass('commentinfo-selected-');
    }
}
DkComPost.prototype.$dom = function () { return jQuery(this.dom) }
DkComPost.prototype.$boxPanel = function () { return jQuery(this.dom).find('.js-comments-panel') }
DkComPost.prototype.getAjaxAction = function () { return jQuery(this.dom).children('.js-ajax-action').attr('href') }
DkComPost.prototype.getId = function () { return this.$dom().attr('id') }
DkComPost.prototype.getOid = function () { return this.getId().substr(1) }

//
// DkComPostCtrl }}}
// DkComListCtrl {{{
//

function DkComListCtrl(cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    jQuery(document).bind('l:post_new', this, function(e,m){
	    var self = e.data;
	    var btn = new DkComList({'dom': m.post.$dom(), 'post':m.post});
	    jQuery(document).trigger('l:comment_list_new', [{'list':btn}]);
    });
}

function DkComList (cfg) {
    this._wgEvents = [];

    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    this.wgBind('l:toggle_comments', document, this.onToggleComments);
    this.wgBind('l:comment_new_html', document, this.onCommentNewHtml);

    this.newDom(this.$boxComments().contents());
}
DkComList.prototype = new DkWidget();
DkComList.prototype.onToggleComments = function (e,m) {
    if (this.post == m.post) {
	this.toggle();
    }
}
DkComList.prototype.onCommentNewHtml = function (e,m) {
    var post = m.parent.post || m.parent;
    if (this.post.getOid() == post.getOid()) {
	this.addComment(m.html, m.comment_id, m.parent);
    }
}
DkComList.prototype.$dom = function () { return jQuery(this.dom).find('.js-comments-list') }
DkComList.prototype.$boxComments = function () { return this.$dom() }
//DkComList.prototype.$comments = function () { return this.$dom().find('.js-comment') }
//DkComList.prototype.$More = function () { return this.$dom().find('.js-more-box') }

DkComList.prototype.addComment = function (html, comment_id, parent) { 
    if (!this.isLoaded()) {
	this.show();
    } else {
	var $html = jQuery(html);
	if (parent.post) { // это коммент
	    // вставим сразу после коммента
	    $html.insertAfter(parent.$dom());
	} else { // это пост
	    // вставим в список комментов последним
	    this.$boxComments().append($html);
	}
	jQuery(document).trigger('l:comment_new_dom', [{'dom':$html, 'list':this}]);
    }
}

DkComList.prototype.newDom = function ($dom) { 
    var self = this;

    $dom.filter('.js-comment').each(function(i,dom){
	jQuery(document).trigger('l:comment_new_dom', [{'dom':dom, 'list':self}]);
    });
    $dom.filter('.js-more-box').each(function(i,dom){
	jQuery(document).trigger('l:comment_more_new_dom', [{'dom':dom, 'list':self}]);
    });
}
DkComList.prototype.show = function () { 
    if (!this.isShowed()) {
	if (!this.isLoaded()) { 
	    var self = this;
	    theDkComService.getComments({
			'@meta': { 'url': this.post.getAjaxAction() },
			'item_id':this.post.getOid()}, function(ask, ans) {
		var $html = jQuery(ans.html);
		self.$boxComments().removeClass('dn').html($html);
		self.newDom($html);
		self.$boxComments().removeClass('dn');
		jQuery(document).trigger('l:comment_list_showed', [{'list':self}]);
	    });
	} else {
	    this.$boxComments().removeClass('dn');
	    jQuery(document).trigger('l:comment_list_showed', [{'list':this}]);
	}
    }
}
DkComList.prototype.hide = function () { 
    if (this.isShowed()) {
	this.$boxComments().addClass('dn');
	jQuery(document).trigger('l:comment_list_hided', [{'list':this}]);
    }
}
DkComList.prototype.toggle = function () { 
    return this.isShowed() ? this.hide() : this.show();
}
DkComList.prototype.isLoaded = function () { 
    return jQuery.trim(this.$boxComments().html());
}
DkComList.prototype.isShowed = function () { 
    return !this.$boxComments().hasClass('dn') && this.isLoaded();
}
DkComList.prototype.getCommentsCount = function () { 
    return this.$boxComments().find('.js-comment:not(.js-is-dead)').length;
}

//
// DkComListCtrl }}}
// DkComCommentCtrl {{{
//


function DkComCommentCtrl(cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    jQuery(document).bind('l:comment_new_dom', this, function(e,m){
	    var self = e.data;
	    var btn = new DkComComment({'dom': m.dom, 'list':m.list});
	    jQuery(document).trigger('l:comment_new', [{'comment':btn}]);
    });
}

function DkComComment (cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    this.post = this.list.post;
}
DkComComment.prototype.$dom = function () { return jQuery(this.dom) }
DkComComment.prototype.getId = function () { return this.$dom().attr('id') }
DkComComment.prototype.getOid = function () { return this.getId().substr(1) }
DkComComment.prototype.edit = function (m) {
    var self = this;
    // создадим коммент, в ответ получим его id
    theDkComService.editComment(m, function(ask, ans) {
	if (ans.comment_id > 0) { // ок. коммент создан. спросим у севриса как выглядит этот коммент.
	    theDkComService.getFeedComment({
		'@meta': { 'url': self.post.getAjaxAction() },
		'comment_id':ans.comment_id}, function(ask, ans) {
		var $html = jQuery(ans.html);
		self.$dom().replaceWith($html);
		self.dom = $html;
		jQuery(document).trigger('l:comment_new', [{'comment':self}]);
	    });
	} else {
	    window.console.log("error: theDkComService.editComment", ans);
	}
    });
}
// delete comment
DkComComment.prototype.remove = function () {
    var self = this;
    theDkComService.deleteComment({
	    '@meta': { 'url': this.post.getAjaxAction() },
	    'item_oid': this.post.getOid(), 'comment_id': this.getOid()}, function(ask, ans) {
	    if (ans.comment_id != -1) { // ок. коммент удален. спросим у севриса как выглядит теперь этот коммент.
	    theDkComService.getComment({
		'@meta': { 'url': self.post.getAjaxAction() },
		'comment_id':ans.comment_id}, function(ask, ans) {
		self.$dom().replaceWith(ans.html); 
		// FIXME : 2008-09-11 : lucky
		// нужно что-то сказать?
		});
	    } else {
	    window.console.log('error: theDkComService.deleteComment');
	    }
    });
}

//
// DkComCommentCtrl }}}
// DkComMoreCtrl {{{
//


function DkComMoreCtrl(cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    jQuery(document).bind('l:comment_more_new_dom', this, function(e,m){
	    var self = e.data;
	    var btn = new DkComMore({'dom': m.dom, 'list':m.list});
	    jQuery(document).trigger('l:comment_more_new', [{'more':btn}]);
    });
}

function DkComMore (cfg) {
    this._wgEvents = [];
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    this.post = this.list.post;

    this.wgBind('click', this.$btn(), this.onBtnClick);
}
DkComMore.prototype = new DkWidget();

DkComMore.prototype.onBtnClick = function (e) {
    e.preventDefault();
    this.load();
}
DkComMore.prototype.$dom = function () { return jQuery(this.dom) }
DkComMore.prototype.$btn = function (){ return this.$dom().find('.js-more-btn'); }
DkComMore.prototype.getParentOid = function (){ return jUri(this.$btn().attr('href')).queryHash().parent_oid; }
DkComMore.prototype.unbind = function (){ this.wgUnbind(); }
DkComMore.prototype.load = function (){ 
	var self = this;
	theDkComService.getChilds({
		'@meta': { 'url': this.post.getAjaxAction() },
		'comment_id':this.getParentOid()}, function(ask, ans) {
	    self.unbind();
	    var $html = jQuery(ans.html); 
	    self.$dom().replaceWith($html); 
	    self.list.newDom($html);
	});
}

//
// DkComMoreCtrl }}}
// DkComAnswerCtrl {{{
//


function DkComAnswerCtrl(cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    // добавлялка коммента к посту
    jQuery(document).bind('l:post_new', this, function(e,m){
	    var self = e.data;
	    var btn = new DkComAnswer({
		    'dom'       : m.post.$dom(), 
		    'comment'   : m.post,
		    '$boxAnswer': function () {return this.$dom().find('.js-post-answer-box')},
		    '$btn'      : function () {return this.$dom().find('.js-post-answer-btn')},
		    '$title'    : function () {return this.$dom().find('.js-post-answer-title')}
		});
	    jQuery(document).trigger('l:comment_answer_new', [{'answer':btn}]);
    });

    // добавлялка коммента как ответ на коммент
    jQuery(document).bind('l:comment_new', this, function(e,m){
	    var self = e.data;
	    var btn = new DkComAnswer({'dom': m.comment.$dom(), 'comment':m.comment});
	    jQuery(document).trigger('l:comment_answer_new', [{'answer':btn}]);
    });
}

function DkComAnswer (cfg) {
    this._wgEvents = [];

    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    this.wgBind('click', this.$btn(), this.onBtnClick);
    this.wgBind('l:comment_form_showed', document, this.onCommentFormShowed);
    this.wgBind('l:comment_form_closed', document, this.onCommentFormClosed);

    this.t_show = this.$btn().html();
    this.t_close = 'скрыть форму?';
    this.t_closed = '';
    //this.t_showed = 'Добавление комментария';
    this.t_showed = '';
}
DkComAnswer.prototype = new DkWidget();

DkComAnswer.prototype.onBtnClick = function (e) {
    e.preventDefault();
    this.toggle();
}
DkComAnswer.prototype.onCommentFormShowed = function (e,m) {
    if (this.comment == m.form.comment) {
	this.show();
    }
}
DkComAnswer.prototype.onCommentFormClosed = function (e,m) {
    if (this.comment == m.form.comment) {
	this.hide();
    }
}
DkComAnswer.prototype.$dom = function () { return jQuery(this.dom) }
DkComAnswer.prototype.$boxAnswer = function (){ return this.$dom().find('.js-comment-answer-box'); }
DkComAnswer.prototype.$btn = function (){ return this.$dom().find('.js-comment-answer-btn'); }
DkComAnswer.prototype.$title = function (){ return this.$dom().find('.js-comment-answer-title'); }
DkComAnswer.prototype.unbind = function (){ 
    this.$btn().unbind('click');
}
DkComAnswer.prototype.toggle = function (){ 
    this.$btn().hasClass('js-opened') ? this.hide() : this.show();
}
DkComAnswer.prototype.show = function (){ 
    jQuery(document).trigger('l:comment_answer_form_move', [{'dom': this.$boxAnswer(), 'comment': this.comment}]);
    this.$title().html(this.t_showed).addClass('js-opened');
    this.$btn().html(this.t_close).addClass('js-opened');
}
DkComAnswer.prototype.hide = function (){ 
    this.$title().html(this.t_closed).addClass('js-opened');
    this.$btn().html(this.t_show).removeClass('js-opened');
    jQuery(document).trigger('l:comment_answer_form_hide', [{'dom': this.$boxAnswer(), 'comment': this.comment}]);
}

//
// DkComAnswerCtrl }}}
// DkComAnswerFormCtrl {{{
//


function DkComAnswerFormCtrl(cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    var btn = new DkComAnswerForm();
}

function DkComAnswerForm (cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    jQuery(document).bind('l:comment_answer_form_move', this, function(e,m){
	    e.data.move(m.dom, m.comment);
    });
    jQuery(document).bind('l:comment_answer_form_hide', this, function(e,m){
	    if (m.comment == e.data.comment) e.data.hide();
    });
}
DkComAnswerForm.prototype.$box = function () { return jQuery(this.dom) }
DkComAnswerForm.prototype.$dom = function () { return jQuery('#js_comment_answer_form') }
DkComAnswerForm.prototype.$form = function (){ return this.$dom().find('form.js-comment-answer-form'); }
DkComAnswerForm.prototype.$mceList = function (){ return this.$form().find('textarea.mceEditor'); }
DkComAnswerForm.prototype.$fieldComment = function (){ return this.$form().find('[name=comment]'); }
DkComAnswerForm.prototype.$fieldParentOid = function (){ return this.$form().find('[name=parent_oid]'); }
DkComAnswerForm.prototype.$fieldItemOid = function (){ return this.$form().find('[name=item_oid]'); }
DkComAnswerForm.prototype.$btnClose = function (){ return this.$dom().find('.js-form-close'); }
DkComAnswerForm.prototype.$btnOk = function (){ return this.$dom().find('.js-form-ok'); }
DkComAnswerForm.prototype.getAjaxAction = function ($f){ return $f.children('.js-ajax-action').attr('href') || $f.attr('action'); }
DkComAnswerForm.prototype.unbind = function (){ 
    this.$btnOk().unbind('click');
    this.$btnClose().unbind('click');
    mceDisable(this.$mceList());
}
DkComAnswerForm.prototype.bind = function (){ 
    var self = this;
    this.$btnOk().bind('click', this, function(e){
	    e.preventDefault();
	    mceHandle(e.data.$mceList(), e);
	    e.data.hide();

	    // создадим коммент, в ответ получим его id
	    var m = e.data.$form().formHash();
	    m['@meta'] = {'url': e.data.getAjaxAction(e.data.$form())};
	    theDkComService.createComment(m, function(ask, ans) {
		if (ans.status == 0) { // ок. коммент создан. спросим у севриса как выглядит этот коммент.
		    // "чистим" форму
		    self.$fieldComment().val('');
		    // создаем ответ на коммент или пост?
		    var post = self.comment.post ? self.comment.post :  self.comment;
		    theDkComService.getFeedComment({
			'@meta': { 'url': post.getAjaxAction() },
			'comment_id':ans.comment_id}, function(ask, ans) {
			jQuery(document).trigger('l:comment_new_html', 
			    [{'html':ans.html, 'comment_id': ans.comment_id, 'parent': self.comment}]);
		    });
		} else {
		    window.console.log("error: theDkComService.createComment", ans);
		}
	    });
    });
    this.$btnClose().bind('click', this, function(e){
	    e.preventDefault();
	    e.data.hide();
    });
    mceEnable(this.$mceList());
}
DkComAnswerForm.prototype.move = function (dom, comment){ 

    if (this.comment == comment) {
	this.show();
    } else {
	this.hide();

	this.dom = dom;
	this.post = comment.post ? comment.post : comment;
	this.comment = comment;

	if (this.$dom().length == 0) {
	    var self = this;
	    theDkComService.getAnswerForm({
		    '@meta': { 'url': this.post.getAjaxAction() },
		    'item_id': this.post.getOid(), 'comment_id':this.comment.getOid()}, function(ask, ans) {
		var $html = jQuery(ans.html);
		self.$box().html($html);
		self.ajustForm();
		self._hide();
		self.show();
	    });
	} else {
	    this.$dom().appendTo(this.$box());
	    this.ajustForm();
	    this._hide();
	    this.show();
	}
    }
}
/** обновить данные в форме, согласно текущему комменту */
DkComAnswerForm.prototype.ajustForm = function (){ 
    this.$fieldItemOid().val(this.post.getOid());
    this.$fieldParentOid().val(this.comment.getOid());
    // ссылка для отправки данных из формы содержит сообщество
    // т.к. форма одна на всю страницу, нужно менять эту ссылку,
    // ведь на странице могут быть посты из разных сообществ
    this.$form().children('.js-ajax-action').attr('href', 
	    this.post.$dom().children('.js-comment-create-ajax-action').attr('href'));
}
DkComAnswerForm.prototype.show = function (){ 
    if (!this.isShowed()) {
	this.$box().removeClass('dn');
	this.bind();
	jQuery(document).trigger('l:comment_form_showed', [{'form': this}]);
    }
}
DkComAnswerForm.prototype.hide = function (){ 
    if (this.isShowed()) {
	this._hide();
	this.unbind();
	jQuery(document).trigger('l:comment_form_closed', [{'form': this}]);
    }
}
DkComAnswerForm.prototype._hide = function (){ 
    this.$box().addClass('dn');
}
DkComAnswerForm.prototype.isShowed = function (){ 
    return !this.$box().hasClass('dn');
}

//
// DkComAnswerFormCtrl }}}
// DkComTriggerCtrl {{{
//

function DkComTriggerCtrl (cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    jQuery(document).bind('l:post_new', this, function(e,m){
	    var self = e.data;
	    var btn = new DkComTrigger({'dom': m.post.$dom(), 'post':m.post});
    });
}


function DkComTrigger (cfg) {
    this._wgEvents = [];

    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    this.wgBind('click', this.$btn(), this.onBtnClick);
}
DkComTrigger.prototype = new DkWidget();

DkComTrigger.prototype.onBtnClick = function (e) {
    e.preventDefault();
    jQuery(document).trigger('l:toggle_comments', [{'post':this.post}]);
}
DkComTrigger.prototype.$btn = function () { return jQuery(this.dom).find('.js-comments-show-btn') }

//
// DkComTriggerCtrl }}}
// DkComCounterCtrl {{{
//

function DkComCounterCtrl (cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    jQuery(document).bind('l:post_new', this, function(e,m){
	    var self = e.data;
	    var btn = new DkComCounter({'dom': m.post.$dom(), 'post':m.post});
    });
}


function DkComCounter (cfg) {
    this._wgEvents = [];

    this.t_closed = 'Уже есть';
    this.t_empty = 'Комментариев еще нет';
    this.t_close = 'Скрыть';

    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    this.wgBind('r:comment_create_ans', document, this.onCommentCreated);
    this.wgBind('r:comment_delete_ans', document, this.onCommentDeleted);
    this.wgBind('l:comment_list_showed', document, this.onListUpdated);
    this.wgBind('l:comment_list_hided', document, this.onListUpdated);
    this.wgBind('l:comment_list_new', document, this.onListUpdated);
    this.wgBind('l:comment_new_dom', document, this.onListUpdated);
    this.commentsCount = this.loadCommentsCount();
    this.showedCommentsCount = -1;
}

DkComCounter.prototype = new DkWidget();

DkComCounter.prototype.t_comments = function (cc) { return lang().plural(cc, "комментари", "й", "я", "ев") }
DkComCounter.prototype.t_showed = function (cc) { return lang().numeral(cc, "показан", "о", "", "ы") }

DkComCounter.prototype.onCommentCreated = function (e,ask,ans) {
    if (ans.comment_id != -1 && ask.item_oid == this.post.getOid()) {
	this.incrementCommentCount();
    }
}
DkComCounter.prototype.onCommentDeleted = function (e,ask,ans) {
    if (ans.comment_id != -1 && ask.item_oid == this.post.getOid()) {
	this.decrementCommentCount();
    }
}
DkComCounter.prototype.onListUpdated = function (e,m) {
    if (this.post == m.list.post) {
	if (!this.list) this.list = m.list;
	this.paint();
    }
}
DkComCounter.prototype.$btn = function () { return jQuery(this.dom).find('.js-comments-show-btn') }
DkComCounter.prototype.$title = function () { return jQuery(this.dom).find('.js-comments-show-title') }

DkComCounter.prototype.paint = function (){
    if (!this.list) {
	window.console.log('DkComCounter.prototype.paint: "this.list" is empty');
	return;
    }


    if (this.list.isShowed()) {
	this.showedCommentsCount = this.list.getCommentsCount();
	var scc = this.showedCommentsCount; 

	this.$title().html(scc
		?  (this.t_showed(scc)
		    + '&nbsp;' + scc
		    + '&nbsp;' + this.t_comments(scc))
		: this.t_empty
	);
	this.$btn().html(this.t_close);
    } else {
	this.$title().html(this.commentsCount ? this.t_closed : this.t_empty);
	this.$btn().html(this.commentsCount 
		? this.commentsCount + '&nbsp;' + this.t_comments(this.commentsCount)
		: '');
    }
}

DkComCounter.prototype.loadCommentsCount = function (){
    try { 
	return 1* this.$btn().text().match(/\d+/)[0]; 
    } catch (e) { 
	return 0; 
    }
}
DkComCounter.prototype.incrementCommentCount = function (){
    this.commentsCount += 1;
    this.paint();
}
DkComCounter.prototype.decrementCommentCount = function (){
    this.commentsCount -= 1;
    this.paint();
}

//
// DkComCounterCtrl }}}
// DkComDeleteCtrl {{{
//

function DkComDeleteCtrl (cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    jQuery(document).bind('l:comment_new', this, function(e,m){
	    var self = e.data;
	    var btn = new DkComDelete({'dom': m.comment.$dom(), 'comment':m.comment});
    });
}


function DkComDelete (cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    this.$dom().bind('click', this, function(e){
	    e.preventDefault();
	    e.data.comment.remove();
    });
}
DkComDelete.prototype.$dom = function () { return jQuery(this.dom).find('.js-comment-delete-btn') }

//
// DkComDeleteCtrl }}}
// DkComEditCtrl {{{
//


function DkComEditCtrl(cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    // редактировалка коммента
    jQuery(document).bind('l:comment_new', this, function(e,m){
	    var self = e.data;
	    var btn = new DkComEdit({'dom': m.comment.$dom(), 'comment':m.comment});
	    jQuery(document).trigger('l:comment_edit_new', [{'edit':btn}]);
    });
}

function DkComEdit (cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    this.$btn().bind('click', this, function(e){
	    e.preventDefault();
	    e.data.toggle();
    });
    jQuery(document).bind('l:comment_edit_form_showed', this, function(e,m){
	    if (e.data.comment == m.form.comment) {
		e.data.show(true);
	    }
    });
    jQuery(document).bind('l:comment_edit_form_closed', this, function(e,m){
	    if (e.data.comment == m.form.comment) {
		e.data.hide(true);
	    }
    });
    this.t_open = this.$btn().html();
    this.t_close = 'Отменить';
}
DkComEdit.prototype.$dom = function () { return jQuery(this.dom) }
DkComEdit.prototype.$btn = function (){ return this.$dom().find('.js-comment-edit-btn'); }
DkComEdit.prototype.unbind = function (){ 
    this.$btn().unbind('click');
}
DkComEdit.prototype.toggle = function (isEvent){ 
    this.$btn().hasClass('js-opened') ? this.hide(isEvent) : this.show(isEvent);
}
DkComEdit.prototype.show = function (isEvent){ 
    this.$btn().html(this.t_close).addClass('js-opened');
    if (!isEvent) jQuery(document).trigger('l:comment_edit_form_show', [{'dom': this.$dom(), 'comment': this.comment}]);
}
DkComEdit.prototype.hide = function (isEvent){ 
    this.$btn().html(this.t_open).removeClass('js-opened');
    if (!isEvent) jQuery(document).trigger('l:comment_edit_form_close', [{'dom': this.$dom(), 'comment': this.comment}]);
}

//
// DkComEditCtrl }}}
// DkComEditFormCtrl {{{
//


function DkComEditFormCtrl(cfg) {
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];

    jQuery(document).bind('l:comment_edit_form_show', this, function(e,m){
	    if (m.comment.$dom().find('.js-comment-edit-form').length == 0) {
		var btn = new DkComEditForm({'dom':m.dom, 'comment':m.comment});
		btn.show();
	    }
    });
}

function DkComEditForm (cfg) {
    this._wgEvents = [];
    if (typeof cfg == 'object') for (var i in cfg) this[i] = cfg[i];
}
DkComEditForm.prototype = new DkWidget();

DkComEditForm.prototype.unbind = function (){ 
    this.wgUnbind();
    mceDisable(this.$mceList());
}
DkComEditForm.prototype.bind = function (){ 
    this.wgBind('l:comment_edit_form_close', document, this.onCommentEditFormClose);
    this.wgBind('l:comment_edit_form_show', document, this.onCommentEditFormShow);
    this.wgBind('click', this.$btnOk(), this.onBtnOkClick);
    this.wgBind('click', this.$btnClose(), this.onBtnCloseClick);
    mceEnable(this.$mceList());
}

// events
DkComEditForm.prototype.onCommentEditFormClose = function (e,m) { if (m.comment == this.comment) this.close(); }
DkComEditForm.prototype.onCommentEditFormShow = function (e,m)  { if (m.comment == this.comment) this.show(); }
DkComEditForm.prototype.onBtnOkClick = function (e)  { 
    e.preventDefault();
    mceHandle(this.$mceList(), e);

    var m = this.$form().formHash();
    m['@meta'] = {'url':this.getAjaxAction(this.$form())}; 
    this.comment.edit(m);
    this.close();
}
DkComEditForm.prototype.onBtnCloseClick = function (e)  { 
    e.preventDefault();
    this.close();
}

// dom
DkComEditForm.prototype.$box = function () { return jQuery(this.dom) }
DkComEditForm.prototype.$tmpCommentBox = function () { return this.$box().find('.js-comment-orig');}
DkComEditForm.prototype.$form = function (){ return this.$box().find('form.js-comment-edit-form'); }
DkComEditForm.prototype.$mceList = function (){ return this.$form().find('textarea.mceEditor'); }
DkComEditForm.prototype.$fieldItemOid = function (){ return this.$form().find('[name=item_oid]'); }
DkComEditForm.prototype.$btnClose = function (){ return this.$form().find('.js-form-close'); }
DkComEditForm.prototype.$btnOk = function (){ return this.$form().find('.js-form-ok'); }

// methods
DkComEditForm.prototype.getAjaxAction = function ($f){ 
    return $f.children('.js-ajax-action').attr('href') || $f.attr('action');
}
DkComEditForm.prototype.show = function (){ 
    if (!this.isLoaded()) {
	var self = this;
	theDkComService.getEditForm({
		'@meta': { 'url': this.comment.post.getAjaxAction() },
		'comment_id':this.comment.getOid()}, function(ask, ans) {
	    var $html = jQuery(ans.html);

	    var $dom = self.comment.$dom();
	    // заворачиваем содержимое бокса с комментом в $tmpCommentBox
	    $dom.wrapInner('<div class="dn js-comment-orig"></div>');
	    // добавляем в бокс с комментом форму
	    $dom.append($html);

	    self.bind();
	    jQuery(document).trigger('l:comment_edit_form_showed', [{'form': this}]);
	});
    }
}
DkComEditForm.prototype.close = function (){ 
    if (this.isLoaded()) {
	this.unbind();
	var $dom = this.comment.$dom();
	$dom.wrapInner('<div class="dn js-tmp"></div>');
	this.$tmpCommentBox().contents().appendTo($dom);
	$dom.find('.js-tmp').remove();
	jQuery(document).trigger('l:comment_edit_form_closed', [{'form': this}]);
    }
}
DkComEditForm.prototype.isLoaded = function () { 
    return this.$tmpCommentBox().length > 0;
}

//
// DkComEditFormCtrl }}}


var theDkComService;
var theDkComTriggerCtrl     = new DkComTriggerCtrl();
var theDkComCounterCtrl     = new DkComCounterCtrl();
var theDkComCommentCtrl     = new DkComCommentCtrl();
var theDkComMoreCtrl        = new DkComMoreCtrl();
var theDkComAnswerCtrl      = new DkComAnswerCtrl();
var theDkComAnswerFormCtrl  = new DkComAnswerFormCtrl();
var theDkComDeleteCtrl      = new DkComDeleteCtrl();
var theDkComEditCtrl        = new DkComEditCtrl();
var theDkComEditFormCtrl    = new DkComEditFormCtrl();
var theDkComListCtrl        = new DkComListCtrl();
var theDkComPostCtrl        = new DkComPostCtrl();


jQuery().ready(function(){
	theDkComService = new DkComService({'url': get__Url('/ajax')});

	// HACK : 2008-09-13 : lucky
	// удаляем форму ответа на коммент, если есть.
	jQuery(document).find('#js_comment_answer_form').remove();

	jQuery(document).trigger('l:new_dom', [{'dom': document}]);
});

// vim:foldmethod=marker
